package com.cskaoyan.javase.oop.statickeyword7.notice5;

/**
 * @description: static使用注意事项
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 *
 * static使用注意事项
 * 一个类中，静态方法无法直接调用非静态的方法和属性，也不能使用this，super关键字
 *   - 经典错误：Non-static field/method xxx cannot be referenced from a static context
 *   - 原因：静态方法调用的时候，可能还没有对象，直接访问属于对象的成员变量和成员方法显然不合适
 * - 反过来，一个非静态的方法，可以访问静态的成员
 *   - 因为有对象的时候，一定有静态成员
 *   - 建议采用这种访问形式的时候，使用类名.变量名的形式访问，以示区别，增加代码可读性
 * - 只存在静态成员变量，不存在“静态局部变量”
 *   - 局部变量只有在调用的时候才有意义
 *   - 而静态变量在类加载时就初始化，就存在了
 *   - 如果我一直不调用这个方法，这个“静态局部变量”就一直占着空间，没有意义
 * - 静态方法是类所有，那么静态方法的局部变量就也是类所有，为什么静态方法中也不能有静态局部变量？
 *   - 局部变量一定是方法所有
 *   - 静态方法也是方法，不调用其中的局部变量也没意义
 *
 *
 */
public class Demo {
    public static void main(String[] args) {
        System.out.println(Person.name);
        //main方法也是静态方法
        //不存在静态局部这个概念，这是错的
        //局部变量永远是属于方法的，不可能被静态化
    }
}


class Person{
    static String name;
    int age;

    public void testMember(){
        //Modifier 'static' not allowed here
        //没有静态局部变量
        //因为静态的东西是是类加载结束就存在了，而局部变量是在栈上并且只有方法调用才生效
        //如果这个方法不调用，这个静态”局部变量“就一直占着空间，显然没有意义
        //static String var;
    }

    public static void testStatic(){
        //Non-static field 'age' cannot be referenced from a static context
        //this和super也是不能用
        //this代表当前类的对象，super代表当前类的父类对象
        //静态方法中没有对象，所以this和super都不能用
        //静态方法只能调用静态成员
        //注意在静态方法中访问静态成员，是可以直接写成员的名字的，但是建议加上类名
       String name2 = name;
       String name3 = Person.name;

       //静态的方法中也没有静态局部
        //Modifier 'static' not allowed here
        //static String var;


    }

}